# 二、元组
# 2.1 元组的定义格式
"""
变量名 = (元素1, 元素2, ..., 元素N)

定义空元组
变量名 = ()
变量名 = tuple()

说明:
1. 定义的格式和列表差不多，区别在于列表用[], 元组使用()。并且元组不可修改，
    但是如果元组里嵌套列表，那么可以对元组中的列表进行修改
2. 若元组只有一个元素, 这个数据后面一定要加逗号 否则该类型就不是元组类型
3. 元组可以嵌套元组
4. 元组可以使用下标索引取出元素, 写法和列表一模一样
5. 元组也支持反向索引
"""
# 定义多元素的元组
tuple1 = ("C++", "Java", "Python", 1, 2, 3, True)
print(f"tuple1:{tuple1}, 类型为: {type(tuple1)}")

# 定义空元组
tuple2 = tuple()
print(f"tuple2:{tuple2}, 类型为: {type(tuple2)}")

# 定义单元素的元祖
tuple3 = ("python", ) # 注意：若元组只有一个元素，需要在后面添加一个逗号
print(f"tuple3:{tuple3}, 类型为: {type(tuple3)}")

# 元组的嵌套
tuple4 = ((1, 2, 3), (4, 5, 6))
print(f"tuple4:{tuple4}, 类型为: {type(tuple4)}")

# 元组的下标索引
tuple4 = ((1, 2, 3), (4, 5, 6))
print(tuple4[1][ 2]) # 取6

# 2.2 元组的常见操作
"""
方法1: 查找某个元素, 如果存在返回下标, 否则报错
语法: 对象.index(元素)
"""
tuple5 = (4, 5, 6)
pos = tuple5.index(6)
print(f"6在元组{tuple5}中的下标是: { pos }")

"""
方法2: 统计某个元素出现的次数    
语法: 对象.count(元素)
"""
tuple5 = (1,1,1,2,2,2,3,3,3,33,4,4)
count_3 = tuple5.count(3)
print(f"3在元组{tuple5}中的个数是{count_3}")

"""
方法3: 统计元组内的元素个数
语法: len(对象)
"""
tuple5 = (1,1,1,2,2,2,3,3,3,33,4,4)
print(f"元组{tuple5}中的元素个数是{len(tuple5)}")

# 2.3 元组的遍历
tuple5 = (1,1,1,2,2,2,3,3,3,33,4,4)
# for循环
print("for循环遍历结果: ", end="")
for num in tuple5:
    print(num, end=" ")

print()

# while 循环
print("while循环遍历结果: ", end="")
i = 0
while i < len(tuple5):
    print(tuple5[i], end=" ")
    i += 1
print()

# tuple5[0] = 10000 # 元组不可修改， 会报错~
# 但是如果元组里嵌套列表，那么可以对元组中的列表进行修改
tuple6 = (1,2,3,["Java"])
print(f"修改前: {tuple6}")
tuple6[3][0] = "C++"
print(f"修改后: {tuple6}")

# 2.4 元组的特点总结
"""
1. 可以容纳多个元素
2. 可以容纳不同类型的元素
3. 元组是有序存储的(可以通过下标访问)
4. 元组允许存在重复数据
5. 元组一旦定义完成，就不可以修改（只读的list）
6. 支持循环
综上，多数特性和list一致, 不同点在于元组tuple不可被修改，
    但是如果元组里嵌套列表，那么可以对元组中的列表进行修改。
"""

# 2.5 练习案例
"""
定义一个元组，内容是("周杰伦", 11, ["football","music"])，记录的是一个学生的信息
包括姓名，年龄，爱好

要求:
1. 查询年龄所在的下标位置
2. 查询学生姓名
3. 删除学生爱好中的"football"
4. 增加爱好: coding
"""
stu = ("周杰伦", 11, ["football","music"])

age_pos = stu.index(11)
print(f"查询年龄所在的下标位置: {age_pos}")

name = stu[0]
print(f"查询学生姓名: {name}")
print(f"删除学生爱好中的\"football\"前: {stu}")
del stu[2][0]
print(f"删除学生爱好中的\"football\"后: {stu}")

print(f"添加学生爱好前:{stu}")
stu[2].append("coding")
print(f"添加学生爱好后:{stu}")










